package polymorphism_0914;

/** *父类名称 父类引用=new 子类实例()
 * 通过父类引用.操作的属性和方法，要看父类中是否有这些属性和方法
 * 若存在,判断当前调用的这个方法是否被子类所重写，若重写，则调用的是子类重写后的方法。
 * 能不能.访问方法或属性要看前面父类中有没有.
 * 至于.之后调用的是父类方法还是子类方法，要看后面new的子类是否重写了该方法
 *向下转型：
 * 1.要想发生向下转型，必须首先先进行向上转型
 * 2.类型强转有风险，不能将毫无关系的两个类型之间进行强转
 * ps:判断向下转型有风险，可以使用instanceof关键字来辅助处理
 */
public class Dog extends Animal {
    public static void main(String[] args) {
        Animal animal=new Dog("66",5);
        animal.eat();
//        animal.food="狗粮";不能访问，父类中没有
        animal.eat();//是子类中重写后的方法
        //向下转型
        Dog dog=(Dog)animal;
        dog.bark();
        dog.food="狗粮";
        //类型出错
//        Animal animal1=new Animal ("动物",5);
//        Dog dog1=(Dog) animal1;
        //毫无关系的两个类不能进行强转
//        Cat cat=new Cat("lala",9);
//        Dog dog1=(Dog) cat;
        if(animal instanceof Dog){
            System.out.println("animal是Dog类的实例");
        }
    }
    String food;
    public Dog(String name, int age) {
        //显示调用父类的有参构造
        super(name, age);
    }

    //方法重写
    public void eat() {
        System.out.println(this.name + "正在吃小骨头");
    }

    public void bark() {
        System.out.println("Dog类独有的方法bark");
    }

}
